import { config, constants } from '@/config/index.js';
import { utils, storage } from '@/utils/index.js';
import { initVueI18n } from '@dcloudio/uni-i18n';
import { langs } from '@/locale/language.js';
import messages from '@/locale/index.js';

// 定义函数，返回一个 Promise，还得要发起一个请求
function http(params) {
	const { t } = initVueI18n(messages);

	return new Promise((reslove, reject) => {
		let isAbort = true;
		// 调用请求拦截器
		params = http.interceptors.request(params);

		// 取消请求加载loading的状态，APP内嵌需要静默登录
		// if (params.isAbort) {
		// 	isAbort = params.isAbort;
		// }

		// 请求之前调用 API 提示用户去等待请求
		http.queue.length === 0 && !isAbort && uni.showLoading({
			title: t('locale.loading'),
			mask: true
		});

		// 成功的回调函数，变更 Promise 成功的状态
		params.success = (res) => {
			// 调用拦截器
			reslove(http.interceptors.response(res))
		}

		// 失败的回调函数，变更 Promise 失败的状态
		params.fail = (err) => {
			reject(err)
		}

		// 等待请求完成后会调用 complete 回调函数
		params.complete = () => {
			// console.log('请求结束了...')
			// 调用 API 隐藏掉加载提示框

			// 当请求结束后，将数组 http.queue 长度减 1
			http.queue.pop()

			// 当所有请求都结束后，http.queue 长度会再次为 0
			http.queue.length === 0 && !isAbort && uni.hideLoading();
		}

		// 向数组 http.queue 中追加新的单元
		// 有几次请求数组就会有几个单元
		// http.queue.push('loading')

		params.sslVerify = false;
		params.timeout = 240000;

		// 发起请求
		uni.request(params)
	})

}

// 定义数组记录请求的数量
http.queue = []

// 定义拦截器
http.interceptors = {
	// 请求拦截器
	request(params) {
		// 定义一个正则表达式 必须http 或者https开头
		const reg = /^https?/i;
		const userInfo = storage.getItem('userInfo');
		const token = storage.getItem('token');
		const langSys = uni.getLocale();
		const langInfo = langs.find(item => item.code == langSys) || langs[0];

		if (params.data.isAbort) {
			params.isAbort = true;
			delete params.data.isAbort;
		}

		if (langInfo) {
			params.data = Object.assign({}, {language: langInfo.type}, params.data);
		}
		
		if (params.data.hasLang) {
			delete params.data.language;
			delete params.data.hasLang;
		}

		// 添加提请求头
		const header = params.header || {};

		// 添加固定参数， 登录后的token
		if (userInfo) {
			header['cuid'] = userInfo.cuid;
		}

		if (token) {
			header['x-token'] = token;
		}

		header['version'] = constants.VERSION;
		header['source'] = constants.SOURCE;

		if (params.url.indexOf('upload') >= 0) {
			header['content-type'] = 'multipart/form-data';
		} else {
			header['content-type'] = 'application/json';
		}

		params.header = header;

		// 在内部处理数据
		return Object.assign({}, params);
	},

	// 响应拦截器
	response(data) {
		const { data: res} = data;
		const { t } = initVueI18n(messages);

		// 用户未登录或者已失效
		if (res.code == 7) {
			uni.showToast({
				title: t('locale.toast.expired'),
				icon: 'none',
				complete: function() {
					const userInfo = storage.getItem('userInfo');
					uni.reLaunch({
						url: `/pages/login/login${ userInfo?.email ? '?email=' + userInfo?.email : ''}`,
						success: function() {
							loginStore().setLogout();
							uni.hideToast();
						}
					});
				}
			})
		} else if ([0,200].includes(res.code)){
			return data
		} else if (res.file_length) {
			return res
		} else {
			return data
		}
	}
}

// 并发处理
http.all = (...promises) => {
	return Promise.all(promises)
}

// 快捷方法（专门用于 get 请求）
http.get = (url, data) => {
	return http({
		url,
		method: 'GET',
		data
	})
}

// 快捷方法（专门用于 post 请求）
http.post = (url, data) => {
	return http({
		url,
		method: 'POST',
		data
	})
}

// 导出 http 函数
export {
	http
};